//
//  DataBaseManager.m
//  UI 22 - 数据库
//
//  Created by hesiyao on 16/1/6.
//  Copyright © 2016年 www.lanou3g.com蓝鸥科技. All rights reserved.
//

#import "DataBaseManager.h"

@implementation DataBaseManager

+(DataBaseManager *)shareInstance
{
    // 定义静态指针变量 保证指针只有一个 静态区的值程序结束时释放 如果不是静态的就会每次创建 仅初始化一次 单例对象不管是ARC还是MRC都不需要release
    static DataBaseManager *dbManager = nil;
    // 是否是第一次调用该方法
    
    if (!dbManager) {
        // 如果指针为空创建对象
        dbManager = [[DataBaseManager alloc] init];
        
    }
    // 如果指针不为空返回
    return dbManager;
}

/// 开启数据库
- (void)openDB
{
    // 数据库 一般放在Document下
    // 后缀: db/sqlite
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"suibian.db"];
    // 创建数据库文件
    // 判断dbPoint指针中是否存在数据库 如果不存在 再创建
    // 参数1 : 数据库路径
    // 参数2 : 数据库指针地址
   int result = sqlite3_open(path.UTF8String, &dbPoint);// 判断指针是不是保存了地址
    NSLog(@"打开数据库: %d, 路径: %@", result, path);
    
 }

/// 关闭数据库
-(void)closeDB
{
    sqlite3_close(dbPoint);
}

/// 创建表 SQL语句在任何数据库都可以用 数据库里面不区分大小写
-(void)createTable
{
    //1.SQL语句
    // exists 存在
    // text 字符串
    // integer 整数
    // primary key 主键
    // autoincrement 自动增加 如果不写MOVIE 要自己给 如果写了就不用自己给
    NSString *createSQL = @"CREATE TABLE IF NOT EXISTS movie (movieName text, pubdate text, movieId integer PRIMARY KEY AUTOINCREMENT)"; // 创建一个表如果不存在
    // 2.执行语句
    // 参数1 : 数据库指针
    // 参数2 : SQL语句
   int result = sqlite3_exec(dbPoint, createSQL.UTF8String, NULL, NULL, NULL);
    // 判断
//    if (result == SQLITE_OK) {
//        NSLog(@"创建成功");
//    }else
//    {
//        // 打印错误信息 原因可以点击查看
//        NSLog(@"失败 :%d", result);
//    }
    [self judgeResult:result message:@"创建表"];
}

/// 删除表
-(void)dropTable
{
    //1. SQL
    NSString *dropSQL = @"DROP TABLE movie";
    //2. 执行
    int result = sqlite3_exec(dbPoint, dropSQL.UTF8String, NULL, NULL, NULL);
    // 3.判断
    [self judgeResult:result message:@"删除表"];
}

/// 增

-(void)insertMovie:(Movie *)m
{
    //1.SQL语句
    NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO movie (movieName, pubdate) values('%@', '%@')",m.movieName, m.pubdate];
    //2.执行
    int result = sqlite3_exec(dbPoint, insertSQL.UTF8String, NULL, NULL, NULL);
    
    //3.判断
    [self judgeResult:result message:@"插入数据"];
}

/// 删除

-(void)deleteMovieWithId:(NSInteger)movieId
{
    //1.SQL语句
    NSString *deleteSQL = [NSString stringWithFormat:@"DELETE FROM movie WHERE movieId = '%ld'", movieId];
    int result = sqlite3_exec(dbPoint, deleteSQL.UTF8String, NULL, NULL, NULL);
    //2.执行
    [self judgeResult:result message:@"删除数据"];
    //3.判断
}

/// 更新

-(void)updateMovieWith:(Movie *)newM withId:(NSInteger)movieId
{
    NSString *updateSQL = [NSString stringWithFormat:@"UPDATE movie SET movieName = '%@', pubdate = '%@' WHERE movieId = '%ld'", newM.movieName, newM.pubdate, movieId];
    int result = sqlite3_exec(dbPoint, updateSQL.UTF8String, NULL, NULL, NULL);
    [self judgeResult:result message:@"更新数据"];
}
/// 查询

-(NSMutableArray *)select
{
    // 查询后 数据处理过程
    // 1. 获取到所有数据
    // 2, 先遍历行 得到每一条数据
    // 3. 再遍历当前行的每一列 按照对应关系 保存在Model中 Model添加到数组 返回
    // SQL语句
    NSString *selectedSQL = @"SELECT * FROM movie";
    // 2.创建数据库替身
    sqlite3_stmt *stmt = nil;
    // 3.准备SQL语句 // -1 表示不限制
    // sqlite3_prepare_v2函数 把数据库对象/SQL语句/数据库替身 关联在一起
    int result = sqlite3_prepare_v2(dbPoint, selectedSQL.UTF8String, -1, &stmt, nil);
    // 4.初始化准备的数组(不写在if里面是因为无法返回 或者要在else里也返回)
    NSMutableArray *arr = [NSMutableArray array];
    // 4.判断准备是否成功
    if (result == SQLITE_OK) {
        NSLog(@"查询准备成功");
        // 6. 遍历每一行数据
        // sqlite3_step(stmt) 获取每一行的信息
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            // 7.逐行获取每一列信息
            // 列数从0 开始
            const unsigned char *mName = sqlite3_column_text(stmt, 0);
            const unsigned char *pubdate = sqlite3_column_text(stmt, 1);
            int mId = sqlite3_column_int(stmt, 2);
            // 创建model对象
            Movie *m = [Movie new];
            m.movieName = [NSString stringWithUTF8String:(const char *)mName];
            m.pubdate = [NSString stringWithUTF8String:(const char *)pubdate];
            m.movieId = mId;
            // 添加到数组
            [arr addObject:m];
        }
        
    }else
    {
        NSLog(@"查询失败%d", result);
    }
    return arr;
}

/// 判断方法
//参数1: 判断的数组
// 参数2 : 打印信息
- (void)judgeResult:(int )r message:(NSString *)message
{
    if (r == SQLITE_OK) {
        NSLog(@"成功%@",message);
    }else
    {
        NSLog(@"%@失败: %d", message,r);
    }
}
@end
